package de.e2it3t.schulverwaltung.ui;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.validation.ValidationResult;
import com.jgoodies.validation.ValidationResultModel;
import com.jgoodies.validation.util.DefaultValidationResultModel;
import com.jgoodies.validation.view.ValidationResultViewFactory;
import de.e2it3t.schulverwaltung.App;
import de.e2it3t.schulverwaltung.data.Klasse;
import de.e2it3t.schulverwaltung.data.Lehrer;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

/**
 * Dialog zum Erstellen und Bearbeiten einer Klasse.
 * 
 * @author Markus Kunz
 */
public class KlassenDialog extends JDialog{
    private JButton saveButton;
    private JButton cancelButton;
    private JTextField BezeichnungField;
    private JComboBox KlassenLehrerBox;
    
    private Klasse klasse;
    private List<Lehrer> lehrer;
    
    private ValidationResultModel validationModel;
    private AppView owner;
    
    
    /**
     * Dialog zum Erstellen einer neuen Klasse.
     * 
     * @param owner View, welche den Dialog geöffnet hat
     */
    public KlassenDialog(AppView owner) {
        // lege für den zu bearbeitenden Schüler eine ungpltige ID fest
        this(owner,0);
    }
    
    /**
     * Dialog zum Bearbeiten eines bestehenden Klasse.
     * 
     * @param owner View, welche den Dialog geöffnet hat
     * @param klassenId ID des Schülers; wenn die ID ungültig ist, wrid ein
     * Dialog zum Erstellen eines neuen Schülers angezeigt
     */
    public KlassenDialog(AppView owner, int klassenId) {
        setTitle("Neue Klasse");
        setModal(true);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setMinimumSize(new Dimension(100, 100));
        
        this.owner = owner;
        
        if (klassenId != 0) {
            klasse = App.getDatabase().getKlasse(klassenId);
            
            if (klasse != null) {
                // ID ist korrekt, wir bearbeiten einen Schüler
                setTitle("Klasse bearbeiten");
            }
        }
        
        // Modell, welches Validierungsfehler erhält und diese in eine
        // Liste im Dialog füllt
        validationModel = new DefaultValidationResultModel();
        lehrer = App.getDatabase().getLehrer();
        
        setupUi();
        setupLehrerDropBox();
        setupklasse();
    }
    
    private void setupLehrerDropBox()
    {
        for (int i = 0; i < lehrer.size(); i++) {
            KlassenLehrerBox.addItem(lehrer.get(i));
        }
    }
    
    /**
     * Dialog Komponenten erstellen.
     */
    private void setupUiComponents() {
        BezeichnungField = new JTextField();
        KlassenLehrerBox = new JComboBox();
        
        saveButton = new JButton("Speichern");
        saveButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                validateAndSave();
            }
        });
        
        cancelButton = new JButton("Abbrechen");
        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                // wir zerstören den Dialog einfach
                dispose();
            }
        });
    }
    
    /**
     * Fülle UI mit den Daten der zu berbeitenden Klasse (falls vorhanden).
     */
    
    private void setupklasse() {
        if (klasse == null) {
            return;
        }
        
        BezeichnungField.setText(klasse.getBezeichnung());
        int lehrerid = klasse.getKlassenlehrerId();
        for (Lehrer l : lehrer) {
            if (l.getId() == lehrerid) {
                KlassenLehrerBox.setSelectedItem(l);
            }
        }
    }
    
     
    /**
     * Erstelle den Dialog.
     */
    private void setupUi() {
        setupUiComponents();
        
        JPanel content = new JPanel();
        content.setBorder(new EmptyBorder(10, 10, 10, 10));
        content.setLayout(new FormLayout(
                "pref, 5px, pref, 5px, pref",
                "pref, 5px, pref, 5px, pref, 5px, pref, 15px, pref"));
        CellConstraints cc = new CellConstraints();
        
        // Liste der Validierungmeldungen erstellen
        JComponent errorList = ValidationResultViewFactory.createReportList(
                validationModel);
        errorList.setPreferredSize(new Dimension(10, 50));
        
        // Komponenten im Dialog positionieren
        
        content.add(new JLabel("Bezeichnung"), cc.xy(1, 1));
        content.add(BezeichnungField, cc.xywh(3, 1, 3, 1));
        content.add(new JLabel("Lehrer"), cc.xy(1, 5));
        content.add(KlassenLehrerBox, cc.xywh(3, 5, 3, 1));
        content.add(errorList, cc.xywh(1, 7, 5, 1));
        content.add(saveButton, cc.xy(3, 9));
        content.add(cancelButton, cc.xy(5, 9));
        
        setLayout(new BorderLayout());
        add(content, BorderLayout.CENTER);
        
        // gewünschte Größe des Dialog berechnen und setzen
        pack();
        // Dialog ist auf eine Größe fixiert
        setResizable(false);
        // Dialog in die Mitte des Bildschirms bringen
        setLocationRelativeTo(null);
    }
    
    private void validateAndSave() {
        ValidationResult result = new ValidationResult();
        Klasse kl = new Klasse();
        if (klasse != null) {
            kl.setId(klasse.getId());
        }
        
        kl.setKlassenlehrerId(((Lehrer)KlassenLehrerBox.getSelectedItem()).getId());
        
        kl.setBezeichnung(BezeichnungField.getText().trim());
        
        if (kl.getBezeichnung().equals("")) {
            result.addError("bezeichnung ist leer!");
        }
        
        validationModel.setResult(result);
        pack();
        
        if (result.isEmpty()) {
            // Klassen Angaben sind valide, speichern, schließen
            App.getDatabase().saveKlasse(kl);
            owner.refreshView();
            dispose();
        }
    }
}
